package map;

import java.util.*;

/*
 * map的遍历
 * Map的遍历有三种方法
 * 1.遍历所欲的key
 * 2.遍历所有的value
 * 3.遍历每一组键值对(key和value)
 * */
public class MapDemo2 {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("英语", 20);
        map.put("数学", 98);
        map.put("化学", 100);
        map.put("生物", 80);
        map.put("语文", 100);
        System.out.println(map);

        /*
         * 遍历所有的key
         * Set keySet()
         * 将当前Map中的所有key以Set集合形式返回
         * 此处使用set集合时因为set中内容不可以重复，和key的定义一致
         * */
        Set<String> strings = map.keySet();
        for (String str : strings) {
            System.out.println(str);
        }

        /*
        * 遍历所有的key和value
        * Set<Map.Entry<K,V>> entrySet()
        * 获取当前Map中每一组键值对，以一个Entry实例形式返回，并最终以一个Set集合全部返回
        *
        * 将获取到的键值对存放在一个Entry对象当中在将这个Entry对象放在一个set集合当中
        * 获取数据的时候就可以 通过遍历set集合中的所有Entry对象中的getKey和getValue方法获取想要的数据
        * Entry指定泛型时 和map所指定的泛型一致就可以
        *
        * 就是将每组key和value分别放在不同的entry对象当中，并且将所有的entry对象存在一个set集合当中
        * entry中分别获取当前key和当前value的方法
        * */
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for (Map.Entry<String,Integer> e : entrySet){
            System.out.println(e.getKey());
            System.out.println(e.getValue());
        }

        /*
        * 遍历所有的value
        * Collection valyes()
        * 将当前Map中所有的value以一个集合的形式返回
        * Collection 是所有集合的顶级接口
        * map不是集合 Map是集合框架中的一位
        * */
        Collection<Integer> values = map.values();
        System.out.println(values);

        /*
        * JDK8之后，java针对集合和Map又提供了一种遍历方式，是基于Lambda表达式的遍历ForEach
        * */
        //集合的forEach
        //e接收变量，sout打印结果
        values.forEach( e -> System.out.println(e));
        /*
        * 当lambda表达式中的参数和表达式调用的方法中传入的参数一致时，可以使用方法引用的写法
        * e ->System.out.printlb(e)
        * ^                      ^
        *   System.out::println
        * */
        values.forEach(System.out::println);

        /*
        * Map的遍历
        * 和上述一样 他会自动设置泛型类型
        * */
        map.forEach((k,v)-> System.out.println(k+" "+v));
    }
}
